package music.controller;

import music.handler.MVCHandler;
import music.listener.MVCStartupListener;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Servlet implementation class MVCController
 */
@WebServlet("*.do")
public class MVCController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		processRequest(req, res);
	}

	protected void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
		processRequest(req, res);
	}

	private void processRequest(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		String uri = req.getRequestURI();
		// 클라이언트의 요청 uri를 알아냄

		String action = uri.substring(uri.lastIndexOf("/"));
		// 요청 uri 중 맨 뒷부분만 잘라냄
		System.out.println(uri + " : " + action);

		MVCHandler handler = (MVCHandler) MVCStartupListener.getHandlerMap()
				.get(action);
		// 추출한 액션이름으로 연관있는 핸들러 클래스를 가져옴
		// 연관있는 핸들러 클래스들은 MVCStartupController에서
		// hashmap으로 저장해두었으므로 getHandlerMap()의
		// get()로 검색할 수 있음

		String viewPage = handler.execute(req, res);
		// 핸들러 클래스의 execute 메서드를 실행하고
		// 그 결과로 뷰 페이지를 받음

		String viewType[] = viewPage.split("[|]");
		// | 문자로 뷰 페이지 처리방식과 처리내용을 분리

		switch (viewType[0]) {
		case "1": // index, join, login, list ...
			RequestDispatcher rd = req.getRequestDispatcher(viewType[1]);
			// 페이지 변경 요청을 서버에서 하기 위해
			// RequestDispatcher 객체 선언
			rd.forward(req, res);
			// 요청을 서버에서 만들어 처리
			
			break;
		case "2": // joinok, loginok, writeok ...
			res.sendRedirect(viewType[1]);
			// 페이지 변경을 클라이언트에서 요청
			break;
		}

	}

}
